home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
081-090
/
amok82
/
plot
/
source
/
plot.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
49KB
|
1,355 lines
(***********************************************************************
:Program. Plot
:Author. Stefan Köhle
:Address. Erhardtstr. 10
W-7033 Herrenberg
:Phone. 07032/5146
:shortcut.
:Version. 1.0
:Date. 31.12.92
:Copyright. nix
:Language. Modula-II.
:Translator. M2Amiga 4.107d
:Imports. Formelauswertung,
FormelausFText by Stefan Salewski (AMOK 11)
Req.Library by Jürgen Zimmermann (AMOK 55)
ReqSupport by Jürgen Zimmermann (AMOK 55)
ReqTools.Library by Nico Francois (AMOK 69)
ReqTools.def by Kai Bolay (AMOK 69)
ReqToolsSupport by Frank Lömker (AMOK 69)
IFFLib by Christian A. Weber (AMOK 18)
IFFLib.def by Fridtjof Siebert (AMOK 18)
PlotInit,PlotZeichnen,
PlotZeichnen2,MyMathLib by myself
:UpDate. -
:Contents.
:Remark.
**********************************************************************)
MODULE Plot ;
FROM Formelauswertung IMPORT FFPBerechnung,varListFFP,DefFormel,Formelnummer,
AssignFFP;
FROM FormelausFText IMPORT GetFehlertext ;
FROM ReqSupport IMPORT GetPathFromLock ;
FROM PlotInit IMPORT PlotBasePtr,PlotBase,UpdateMenus,
Laden,Speichern,WelcheTaste,MenuNummer,ItemNummer,
CleanUp,SetUp,ScreenHoch,ScreenWeg,
ArgTesten,FunktionHolen,
UpdatePb,BildSpeichern,BildLaden,
Request,YesNoRequest ;
FROM PlotZeichnen IMPORT RasterZeichnen,RestRaster,BeschriftungZeichnen,
ClearBitMap,FunktionReinSchreiben,HelpFenster ;
FROM PlotZeichnen2 IMPORT KastenZeichnen,XAchseZeichnen,
YAchseZeichnen,RestYAchseZeichnen,
ZAchseZeichnen,RestXAchseZeichnen ;
FROM MyMathLib IMPORT IntToReal,RealToInt,IntToFFP,FFPToInt ;
IMPORT Arts,DosL ;
IMPORT IntuitionL ;
IMPORT InOut ;
FROM DosD IMPORT FileLockPtr;
FROM WorkbenchD IMPORT WBStartupPtr;
FROM Arguments IMPORT NumArgs,GetArg ;
FROM SYSTEM IMPORT ADDRESS,ADR,FFP,LONGSET ;
FROM IntuitionL IMPORT ScreenToFront,SetMenuStrip,ClearMenuStrip;
FROM IntuitionD IMPORT IDCMPFlagSet,menuPick,IntuiMessage,IntuitionBasePtr,
MenuItem,MenuItemFlags,MenuItemFlagSet,Menu,rawKey,
IntuiText,WindowPtr ;
FROM GraphicsL IMPORT Move,Draw,SetAPen,SetDrMd,SetRGB4,AreaMove,
AreaDraw,AreaEnd,SetBPen,RectFill,Text ;
FROM GraphicsD IMPORT jam1,GfxBasePtr;
FROM String IMPORT Length,Compare,Copy ;
FROM GfxMacros IMPORT SetDrPt,SetOPen ;
FROM ExecL IMPORT GetMsg,ReplyMsg,WaitPort,AllocMem,FreeMem ;
FROM ExecD IMPORT MemReqSet,MemReqs ;
FROM LayersL IMPORT ScrollLayer ;
FROM UtilityD IMPORT tagEnd,TagPtr ;
CONST BitMapWidth = 1720 ;
BitMapHeight = 1351 ;
TYPE
Menus = (Menu1,Menu2,Menu3) ;
Items = (Item1,Item2,Item3,Item4,Item5,Item6,Item7,Item8) ;
ItemTyp = ARRAY [Menu1..Menu3],[Item1..Item8] OF MenuItem ;
String = ARRAY[0..20] OF CHAR ;
Variablen = RECORD
IntuiBase : IntuitionBasePtr ;
PadFaktorX : FFP ;
PadFaktorY : FFP ;
PadHeight : INTEGER ;
PadWidth : INTEGER ;
Ende : BOOLEAN ;
OK : BOOLEAN ;
Ausstieg : BOOLEAN ;
NeuBerechnen: BOOLEAN ;
Argument : BOOLEAN ;
len : INTEGER ;
error : INTEGER ;
fN : CARDINAL ;
MaxErgebnis : FFP ;
XNormiert : FFP ;
YNormiert : FFP ;
FaktorX : FFP ;
FaktorY : FFP ;
FaktorZ : FFP ;
YWertmax : INTEGER ;
YWertmin : INTEGER ;
msg : WBStartupPtr;
lock : FileLockPtr;
Item : ItemTyp ;
MenuStrip : ARRAY [Menu1..Menu3] OF Menu ;
ItemTexts : ARRAY [Menu1..Menu3],[Item1..Item8] OF
IntuiText ;
END (* RECORD *) ;
VAR
Pb : PlotBasePtr ; (* alle globalen Variablen *)
V : POINTER TO Variablen ; (* alle lokalen Variablen *)
k : REAL ;
x,y : INTEGER ;
i,j : INTEGER ;
F : FFP ;
PROCEDURE InitMenu(VAR Pb: PlotBasePtr) ; (*********************************)
VAR
SubItem : MenuItem ;
SubItemText : IntuiText ;
m : Menus ;
t : Items ;
BEGIN
WITH V^.MenuStrip[Menu1] DO
nextMenu := ADR(V^.MenuStrip[Menu2]) ;
leftEdge := 10 ; width := 70 ;
topEdge := 0 ; height := 0 ;
flags := {0} ;
menuName := ADR('Projekt') ;
firstItem := ADR(V^.Item[Menu1,Item1]) ;
END (* WITH *) ;
V^.MenuStrip[Menu2] := V^.MenuStrip[Menu1] ;
WITH V^.MenuStrip[Menu2] DO
nextMenu := ADR(V^.MenuStrip[Menu3]) ;
leftEdge := 90 ; width := 100 ;
menuName := ADR('Auflösung') ;
firstItem := ADR(V^.Item[Menu2,Item1]) ;
END (* WITH *) ;
V^.MenuStrip[Menu3] := V^.MenuStrip[Menu1] ;
WITH V^.MenuStrip[Menu3] DO
nextMenu := NIL ;
leftEdge := 190 ; width := 120 ;
menuName := ADR('Einstellungen') ;
firstItem := ADR(V^.Item[Menu3,Item1]) ;
END (* WITH *) ;
WITH V^.Item[Menu1,Item1] DO (* allgemein *)
nextItem := ADR(V^.Item[Menu1,Item2]) ;
leftEdge := -5 ; topEdge := 0 ;
height := 20 ; (* 150 *)
flags := MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
mutualExclude := LONGSET{} ;
itemFill := ADR(V^.ItemTexts[Menu1,Item1]);
selectFill := NIL ;
subItem := NIL ;
END (* WITH *) ;
WITH V^.ItemTexts[Menu1,Item1] DO
frontPen := 0; backPen := 1 ; drawMode := jam1 ;
leftEdge := 2; topEdge := 5 ; iTextFont:= NIL ;
nextText := NIL ;
END (* WITH *) ;
V^.Item[Menu1,Item1].width := 25*8 ;
FOR t := Item1 TO Item8 DO
V^.Item[Menu3,t] := V^.Item[Menu1,Item1] ;
V^.ItemTexts[Menu3,t] := V^.ItemTexts[Menu1,Item1] ;
END (* FOR *) ;
V^.Item[Menu1,Item1].width := 15*8 ;
FOR t := Item1 TO Item8 DO
V^.Item[Menu2,t] := V^.Item[Menu1,Item1] ;
V^.ItemTexts[Menu2,t] := V^.ItemTexts[Menu1,Item1] ;
END (* FOR *) ;
V^.Item[Menu1,Item1].width := 19*8 ;
FOR t := Item1 TO Item8 DO
V^.Item[Menu1,t] := V^.Item[Menu1,Item1] ;
V^.ItemTexts[Menu1,t] := V^.ItemTexts[Menu1,Item1] ;
END (* FOR *) ;
EXCL(V^.Item[Menu1,Item1].flags,checkIt) ;
V^.Item[Menu1,Item2].nextItem := ADR(V^.Item[Menu1,Item3]) ; (* Funktion ändern *)
V^.Item[Menu1,Item2].topEdge := 21 ;
EXCL(V^.Item[Menu1,Item2].flags,checkIt) ;
V^.Item[Menu1,Item2].itemFill := ADR(V^.ItemTexts[Menu1,Item2]) ;
V^.Item[Menu1,Item3].nextItem := ADR(V^.Item[Menu1,Item4]) ;(* Funktion laden*)
V^.Item[Menu1,Item3].topEdge := 43 ;
EXCL(V^.Item[Menu1,Item3].flags,checkIt) ;
V^.Item[Menu1,Item3].itemFill := ADR(V^.ItemTexts[Menu1,Item3]) ;
V^.Item[Menu1,Item4].nextItem := ADR(V^.Item[Menu1,Item5]) ;(*Funktion speichern *)
V^.Item[Menu1,Item4].topEdge := 65 ;
EXCL(V^.Item[Menu1,Item4].flags,checkIt) ;
V^.Item[Menu1,Item4].itemFill := ADR(V^.ItemTexts[Menu1,Item4]) ;
V^.Item[Menu1,Item5].nextItem := ADR(V^.Item[Menu1,Item6]) ;(* Bild speichern *)
V^.Item[Menu1,Item5].topEdge := 87 ;
EXCL(V^.Item[Menu1,Item5].flags,checkIt) ;
V^.Item[Menu1,Item5].itemFill := ADR(V^.ItemTexts[Menu1,Item5]) ;
V^.Item[Menu1,Item6].nextItem := ADR(V^.Item[Menu1,Item7]) ;(* Bild laden *)
V^.Item[Menu1,Item6].topEdge := 109 ;
EXCL(V^.Item[Menu1,Item6].flags,checkIt) ;
EXCL(V^.Item[Menu1,Item6].flags,itemEnabled) ;
V^.Item[Menu1,Item6].itemFill := ADR(V^.ItemTexts[Menu1,Item6]) ;
V^.Item[Menu1,Item7].nextItem := NIL ; (* Quit *)
V^.Item[Menu1,Item7].topEdge := 131 ;
EXCL(V^.Item[Menu1,Item7].flags,checkIt) ;
V^.Item[Menu1,Item7].itemFill := ADR(V^.ItemTexts[Menu1,Item7]) ;
V^.Item[Menu2,Item1].nextItem := ADR(V^.Item[Menu2,Item2]) ; (* lächerlich *)
V^.Item[Menu2,Item1].flags :=
MenuItemFlagSet{checkIt,checked,highComp,itemText,itemEnabled} ;
V^.Item[Menu2,Item1].itemFill := ADR(V^.ItemTexts[Menu2,Item1]) ;
V^.Item[Menu2,Item2].nextItem := ADR(V^.Item[Menu2,Item3]) ; (* gering *)
V^.Item[Menu2,Item2].topEdge := 21 ;
V^.Item[Menu2,Item2].flags :=
MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
V^.Item[Menu2,Item2].itemFill := ADR(V^.ItemTexts[Menu2,Item2]) ;
V^.Item[Menu2,Item3].nextItem := ADR(V^.Item[Menu2,Item4]) ; (* mittel *)
V^.Item[Menu2,Item3].topEdge := 43 ;
V^.Item[Menu2,Item3].flags :=
MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
V^.Item[Menu2,Item3].itemFill := ADR(V^.ItemTexts[Menu2,Item3]) ;
V^.Item[Menu2,Item4].nextItem := ADR(V^.Item[Menu2,Item5]) ; (* hoch *)
V^.Item[Menu2,Item4].topEdge := 65 ;
V^.Item[Menu2,Item4].flags :=
MenuItemFlagSet{checkIt,highComp,itemText,itemEnabled} ;
V^.Item[Menu2,Item4].itemFill := ADR(V^.ItemTexts[Menu2,Item4]) ;
V^.Item[Menu2,Item5].nextItem := NIL ; (* noch höher *)
V^.Item[Menu2,Item5].topEdge := 87 ;
V^.Item[Menu2,Item5].itemFill := ADR(V^.ItemTexts[Menu2,Item5]) ;
V^.Item[Menu3,Item1].nextItem := ADR(V^.Item[Menu3,Item2]) ; (* Raster *)
V^.Item[Menu3,Item1].itemFill := ADR(V^.ItemTexts[Menu3,Item1]) ;
V^.Item[Menu3,Item2].nextItem := ADR(V^.Item[Menu3,Item3]) ; (* Kasten *)
V^.Item[Menu3,Item2].topEdge := 21 ;
V^.Item[Menu3,Item2].itemFill := ADR(V^.ItemTexts[Menu3,Item2]) ;
V^.Item[Menu3,Item3].nextItem := ADR(V^.Item[Menu3,Item4]) ; (* Achsen *)
V^.Item[Menu3,Item3].topEdge := 43 ;
V^.Item[Menu3,Item3].itemFill := ADR(V^.ItemTexts[Menu3,Item3]) ;
V^.Item[Menu3,Item4].nextItem := ADR(V^.Item[Menu3,Item5]) ; (* Beschriftung *)
V^.Item[Menu3,Item4].topEdge := 65 ;
V^.Item[Menu3,Item4].itemFill := ADR(V^.ItemTexts[Menu3,Item4]) ;
V^.Item[Menu3,Item5].nextItem := ADR(V^.Item[Menu3,Item6]) ; (* Flaeche *)
V^.Item[Menu3,Item5].topEdge := 87 ;
V^.Item[Menu3,Item5].itemFill := ADR(V^.ItemTexts[Menu3,Item5]) ;
V^.Item[Menu3,Item6].nextItem := ADR(V^.Item[Menu3,Item7]) ; (* f(x,y) *)
V^.Item[Menu3,Item6].topEdge := 109 ;
V^.Item[Menu3,Item6].itemFill := ADR(V^.ItemTexts[Menu3,Item6]) ;
V^.Item[Menu3,Item7].nextItem := ADR(V^.Item[Menu3,Item8]) ; (* kl Bitmap *)
V^.Item[Menu3,Item7].topEdge := 141 ;
V^.Item[Menu3,Item7].itemFill := ADR(V^.ItemTexts[Menu3,Item7]) ;
V^.Item[Menu3,Item8].nextItem := NIL ; (* gr Bitmap *)
V^.Item[Menu3,Item8].topEdge := 163 ;
IF NOT Pb^.GrosserSpeicher THEN
EXCL(V^.Item[Menu3,Item8].flags,itemEnabled) ;
END (* IF *) ;
V^.Item[Menu3,Item8].itemFill := ADR(V^.ItemTexts[Menu3,Item8]) ;
V^.ItemTexts[Menu1,Item1].iText := ADR('neue Funktion') ;
V^.ItemTexts[Menu1,Item2].iText := ADR('Funktion ändern') ;
V^.ItemTexts[Menu1,Item3].iText := ADR('Funktion laden') ;
V^.ItemTexts[Menu1,Item4].iText := ADR('Funktion speichern') ;
V^.ItemTexts[Menu1,Item5].iText := ADR('Bild speichern') ;
V^.ItemTexts[Menu1,Item6].iText := ADR('Bild laden') ;
V^.ItemTexts[Menu1,Item7].iText := ADR('Quit') ;
V^.ItemTexts[Menu2,Item1].iText := ADR(' lächerlich') ;
V^.ItemTexts[Menu2,Item2].iText := ADR(' gering') ;
V^.ItemTexts[Menu2,Item3].iText := ADR(' mittel') ;
V^.ItemTexts[Menu2,Item4].iText := ADR(' hoch') ;
V^.ItemTexts[Menu2,Item5].iText := ADR(' noch höher') ;
V^.ItemTexts[Menu3,Item1].iText := ADR(' Raster') ;
V^.ItemTexts[Menu3,Item2].iText := ADR(' Kasten') ;
V^.ItemTexts[Menu3,Item3].iText := ADR(' Achsen') ;
V^.ItemTexts[Menu3,Item4].iText := ADR(' Beschriftung') ;
V^.ItemTexts[Menu3,Item5].iText := ADR(' Fläche') ;
V^.ItemTexts[Menu3,Item6].iText := ADR(' f(x,y) reinschreiben') ;
V^.ItemTexts[Menu3,Item7].iText := ADR(' kleine Bitmap') ;
V^.ItemTexts[Menu3,Item8].iText := ADR(' grosse Bitmap') ;
V^.OK := SetMenuStrip(Pb^.Screen^.firstWindow,ADR(V^.MenuStrip[Menu1])) ;
IF NOT(V^.OK) THEN
Request('Menus gehn nicht','Na dann nicht',NIL) ;
Arts.Terminate ;
END ;
END InitMenu ;
(*-----------------------------------------------------------------------
Hier wird versucht die Procedur SetUp aus PlotInit aufzurufen.
Falls der Speicher nicht für die große Bitmap langt, wird die
Sparversion versucht.
-----------------------------------------------------------------------*)
PROCEDURE StartUp ; (*******************************************************)
VAR Feler: CARDINAL ;
BEGIN
Feler := SetUp(Pb) ;
IF Feler # 0 THEN
CASE Feler OF
3,4: IF NOT YesNoRequest(
'Der Chipmem langt nur\nfür eine kleine BitMap',
'Abbruch|Also gut',NIL) THEN
Arts.Terminate ; (* Abbruch *)
END (* IF *) ;
ELSE
IF NOT YesNoRequest('Der Speicher langt nur\nfür eine kleine BitMap',
'Abbruch|Also gut',NIL) THEN
Arts.Terminate ; (* Abbruch *)
END (* IF *) ;
END (* CASE *) ;
Pb^.GrosserSpeicher := FALSE ;
Pb^.GrosseBitmap := FALSE ;
Feler := SetUp(Pb) ;
IF Feler # 0 THEN
CleanUp(Pb) ;
CASE Feler OF
2: Request("Kein Speicher für BitmapPtr","Mist",NIL) ; |
3: Request("Kein Speicher für Bitplane","Mist",NIL) ; |
4: Request("Kein Speicher für TempRas","Mist",NIL) ; |
5: Request("Screen geht nicht auf","Mist",NIL) ; |
6: Request("Window geht nicht auf","Mist",NIL) ; |
7: Request("Kein Speicher für Variablen","Mist",NIL) ;
ELSE
Request("Unbekannter Fehler ???","Kaum zu glauben",NIL) ;
END (* CASE *);
Arts.Terminate ;
END (* IF *) ;
END ;
InitMenu(Pb) ;
END StartUp ;
PROCEDURE f(x: FFP; y: FFP ): FFP ; (***********************************)
VAR Ergebnis: FFP ;
BEGIN
varListFFP['x']:= x ;
varListFFP['y']:= y ;
FFPBerechnung(2,Ergebnis,V^.fN) ;
IF Ergebnis > V^.MaxErgebnis THEN
Ergebnis := V^.MaxErgebnis ;
ELSIF Ergebnis < -V^.MaxErgebnis THEN
Ergebnis := -V^.MaxErgebnis ;
END ;
RETURN Ergebnis ;
END f ;
PROCEDURE CheckMessage ; (***************************************************)
VAR
mousex,mousey,
XScroll,YScroll : INTEGER ;
IntuiMsg : POINTER TO IntuiMessage;
class : IDCMPFlagSet ;
code : CARDINAL ;
Taste : CARDINAL ;
Rest : FFP ;
Rest2,Rest3 : FFP ;
BEGIN
IntuiMsg := GetMsg(Pb^.Screen^.firstWindow^.userPort) ;
WHILE IntuiMsg # NIL DO
class := IntuiMsg^.class ;
code := IntuiMsg^.code ;
ReplyMsg(IntuiMsg) ;
IF NOT Pb^.GrosseBitmap THEN
IF (rawKey IN class) THEN
Taste := WelcheTaste(code);
IF NOT (Taste = 0) THEN
CASE Taste OF
280,278 : V^.Ende := TRUE ; | (* ESC,Ctrl C *)
281 : (* Help *)
IF HelpFenster(Pb) THEN END ;
|
260 : (* Cursor rauf *)
Pb^.B.YHinten := Pb^.B.YHinten+0.5*Pb^.B.DeltaY ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
261 : (* Shift rauf *)
Pb^.B.YHinten := Pb^.B.YHinten+Pb^.B.DeltaY ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
262 : (* Alt rauf *)
Pb^.B.YHinten := Pb^.B.YHinten+3.0*Pb^.B.DeltaY ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
265 : (* Cursor runter *)
Pb^.B.YHinten := Pb^.B.YHinten-0.5*Pb^.B.DeltaY ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
266 : (* Shift runter *)
Pb^.B.YHinten := Pb^.B.YHinten-Pb^.B.DeltaY ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
267 : (* Alt runter *)
Pb^.B.YHinten := Pb^.B.YHinten-3.0*Pb^.B.DeltaY ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
270,314 : (* Cursor links,4 *)
Pb^.B.XLinks := Pb^.B.XLinks+0.5*Pb^.B.DeltaX ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
271,324 : (* Shift links,4*)
Pb^.B.XLinks := Pb^.B.XLinks+Pb^.B.DeltaX ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
272,334 : (* Alt links,4 *)
Pb^.B.XLinks := Pb^.B.XLinks+4.0*Pb^.B.DeltaX ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
275,316 : (* Cursor rechts,6 *)
Pb^.B.XLinks := Pb^.B.XLinks-0.5*Pb^.B.DeltaX ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
276,326 : (* Shift rechts,6 *)
Pb^.B.XLinks := Pb^.B.XLinks-Pb^.B.DeltaX ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
277,336 : (* Alt rechts,6 *)
Pb^.B.XLinks := Pb^.B.XLinks-4.0*Pb^.B.DeltaX ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
318 : (* 8 *)
Pb^.B.ZOben := Pb^.B.ZOben-0.5*Pb^.B.DeltaZ ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
328 : (* SHIFT 8 *)
Pb^.B.ZOben := Pb^.B.ZOben-Pb^.B.DeltaZ ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
338 : (* ALT 8 *)
Pb^.B.ZOben := Pb^.B.ZOben-4.0*Pb^.B.DeltaZ ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
312 : (* 2 *)
Pb^.B.ZOben := Pb^.B.ZOben+0.5*Pb^.B.DeltaZ ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
322 : (* SHIFT 2 *)
Pb^.B.ZOben := Pb^.B.ZOben+Pb^.B.DeltaZ ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
332 : (* ALT 2 *)
Pb^.B.ZOben := Pb^.B.ZOben+4.0*Pb^.B.DeltaZ ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
291,301 : (* F1,1 : Zoom in *)
Pb^.B.XLinks := Pb^.B.XLinks+Pb^.B.DeltaX ;
Pb^.B.DeltaX := Pb^.B.DeltaX * 0.5 ;
Pb^.B.YHinten:= Pb^.B.YHinten +0.75*Pb^.B.DeltaY ;
Pb^.B.DeltaY := Pb^.B.DeltaY * 0.5 ;
Pb^.B.ZOben := Pb^.B.ZOben -Pb^.B.DeltaZ ;
Pb^.B.DeltaZ := Pb^.B.DeltaZ * 0.5 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
292,302 : (* F2,2 Zoom in X *)
Pb^.B.XLinks := Pb^.B.XLinks+Pb^.B.DeltaX ;
Pb^.B.DeltaX := Pb^.B.DeltaX * 0.5 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
293,303 : (* F3,3 Zoom in Y *)
Pb^.B.YHinten:= Pb^.B.YHinten +0.75*Pb^.B.DeltaY ;
Pb^.B.DeltaY := Pb^.B.DeltaY * 0.5 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
294,304 : (* F4,4 Zoom in Z *)
Pb^.B.ZOben := Pb^.B.ZOben -Pb^.B.DeltaZ ;
Pb^.B.DeltaZ := Pb^.B.DeltaZ * 0.5 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
295,305 : | (* F5,5 Nix *)
296,306 : (* F6,6 : Zoom out *)
Pb^.B.DeltaX := Pb^.B.DeltaX * 2.0 ;
Pb^.B.XLinks := Pb^.B.XLinks-Pb^.B.DeltaX ;
Rest := 2.0*Pb^.B.XLinks/Pb^.B.DeltaX ;
Rest2 := Rest-IntToFFP(TRUNC(Rest)) ;
Rest3 := 0.5*Pb^.B.DeltaX*Rest2 ;
Pb^.B.XLinks := Pb^.B.XLinks - Rest3 ;
Pb^.B.DeltaY := Pb^.B.DeltaY * 2.0 ;
Pb^.B.YHinten := Pb^.B.YHinten-0.75*Pb^.B.DeltaY ;
Rest := 2.0*Pb^.B.YHinten/Pb^.B.DeltaY ;
Rest2 := Rest-IntToFFP(TRUNC(Rest)) ;
Rest3 := 0.5*Pb^.B.DeltaY*Rest2 ;
Pb^.B.YHinten := Pb^.B.YHinten - Rest3 ;
Pb^.B.DeltaZ := Pb^.B.DeltaZ * 2.0 ;
Pb^.B.ZOben := Pb^.B.ZOben+Pb^.B.DeltaZ ;
Rest := 2.0*Pb^.B.ZOben/Pb^.B.DeltaZ ;
Rest2 := Rest-IntToFFP(TRUNC(Rest)) ;
Rest3 := 0.5*Pb^.B.DeltaZ*Rest2 ;
Pb^.B.ZOben := Pb^.B.ZOben - Rest3 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
297,307 : (* F7,7 Zoom out X *)
Pb^.B.DeltaX := Pb^.B.DeltaX * 2.0 ;
Pb^.B.XLinks := Pb^.B.XLinks-Pb^.B.DeltaX ;
Rest := 2.0*Pb^.B.XLinks/Pb^.B.DeltaX ;
Rest2 := Rest-IntToFFP(TRUNC(Rest)) ;
Rest3 := 0.5*Pb^.B.DeltaX*Rest2 ;
Pb^.B.XLinks := Pb^.B.XLinks - Rest3 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
298,308 : (* F8,8 Zoom out Y *)
Pb^.B.DeltaY := Pb^.B.DeltaY * 2.0 ;
Pb^.B.YHinten := Pb^.B.YHinten-0.75*Pb^.B.DeltaY ;
Rest := 2.0*Pb^.B.YHinten/Pb^.B.DeltaY ;
Rest2 := Rest-IntToFFP(TRUNC(Rest)) ;
Rest3 := 0.5*Pb^.B.DeltaY*Rest2 ;
Pb^.B.YHinten := Pb^.B.YHinten - Rest3 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
299,309 : (* F9,9 Zoom out Z *)
Pb^.B.DeltaZ := Pb^.B.DeltaZ * 2.0 ;
Pb^.B.ZOben := Pb^.B.ZOben+Pb^.B.DeltaZ ;
Rest := 2.0*Pb^.B.ZOben/Pb^.B.DeltaZ ;
Rest2 := Rest-IntToFFP(TRUNC(Rest)) ;
Rest3 := 0.5*Pb^.B.DeltaZ*Rest2 ;
Pb^.B.ZOben := Pb^.B.ZOben - Rest3 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
300,310 : (* F10,10 Reset *)
Pb^.B.XLinks := 0.0;
Pb^.B.DeltaX := 1.0 ;
Pb^.B.YHinten := 0.0 ;
Pb^.B.DeltaY := 1.0 ;
Pb^.B.ZOben := 2.0 ;
Pb^.B.DeltaZ := 1.0 ;
V^.Ausstieg := TRUE ; V^.NeuBerechnen := TRUE ; |
ELSE
END (* CASE *);
END (* IF NOT Taste *) ;
END (* IF rawKey *);
ELSE
IF (rawKey IN class) THEN
Taste := WelcheTaste(code);
IF (Taste = 280) OR (Taste = 278) THEN
V^.Ende := TRUE ;
END ;
END (* IF rawKey *) ;
END (* IF kleine Bitmap *) ;
IF (menuPick IN class) THEN
CASE MenuNummer(code) OF
0: (* Projekt *)
CASE ItemNummer(code) OF
0: (* Neue Funktion *)
IF FunktionHolen(Pb,FALSE,TRUE) THEN
V^.Ausstieg := TRUE;
V^.NeuBerechnen := TRUE ;
Pb^.BildName := Pb^.FunktionName ;
Pb^.GrosseBitmap := FALSE ;
Pb^.B.XLinks := 0.0;
Pb^.B.DeltaX := 1.0 ;
Pb^.B.YHinten := 0.0 ;
Pb^.B.DeltaY := 1.0 ;
Pb^.B.ZOben := 2.0 ;
Pb^.B.DeltaZ := 1.0 ;
Pb^.Schritt := 6 ;
UpdateMenus(Pb,2) ;
UpdateMenus(Pb,3) ;
UpdatePb(Pb) ;
IF Pb^.GrosserSpeicher THEN
ScrollLayer(Pb^.Layer,-Pb^.Layer^.scrollX,
-Pb^.Layer^.scrollY) ;
END (* IF *) ;
END (*IF*); |
1: IF FunktionHolen(Pb,FALSE,FALSE) THEN (* Funktion ändern *)
V^.Ausstieg := TRUE ;
V^.NeuBerechnen := TRUE ;
END (*IF*) ; |
2: IF Laden(Pb,TRUE) THEN (* Funktion laden *)
IF FunktionHolen(Pb,TRUE,FALSE) THEN
Pb^.GrosseBitmap := FALSE ;
UpdateMenus(Pb,2) ;
UpdateMenus(Pb,3) ;
UpdatePb(Pb) ;
IF Pb^.GrosserSpeicher THEN
ScrollLayer(Pb^.Layer,-Pb^.Layer^.scrollX,
-Pb^.Layer^.scrollY) ;
END (* IF *) ;
V^.Ausstieg := TRUE;
V^.NeuBerechnen := TRUE ;
Pb^.BildName := Pb^.FunktionName ;
ELSE
Pb^.Funktion := Pb^.LetzteFunktion ;
V^.Ausstieg := TRUE;
END (* IF FunktionHolen*) ;
END (* IF Laden *); |
3: V^.OK := Speichern(Pb) | (* Funktion speichern *)
4: BildSpeichern(Pb) ; | (* Bild speichern *)
5: V^.error := BildLaden(Pb); (* Bild laden *)
CASE V^.error OF
-1: | (* cancel *)
0 : | (* alles OK *)
1 : Request("Kein Speicher fuer BitmapPtr","Mist",NIL)|
16: Request("File not found","Mist",NIL) |
17: Request("Read error","Mist",NIL) |
18: Request("Zu wenig Pufferspeicher","Mist",NIL) |
19: Request("Kein IFF File","Mist",NIL) |
24: Request("Kein ILBM File","Mist",NIL) |
25: Request("BitMapHeader fehlt","Mist",NIL) |
26: Request("BODY Chunk fehlt","Mist",NIL) |
27: Request("Bild hat zu viele Bitplanes","Mist",NIL) |
28: Request("Unbekannter Kompressions Typ","Sowas",NIL)|
ELSE
END (* CASE *) |
6: V^.Ende := TRUE; |
END (* CASE *) ; |
1: (* Auflösung *)
CASE ItemNummer(code) OF
(* lächerlich *) 0: Pb^.Schritt := 6; V^.Ausstieg := TRUE ;
UpdateMenus(Pb,2) |
(* gering *) 1: Pb^.Schritt := 4; V^.Ausstieg := TRUE ;
UpdateMenus(Pb,2) |
(* mittel *) 2: Pb^.Schritt := 3; V^.Ausstieg := TRUE ;
UpdateMenus(Pb,2) |
(* hoch *) 3: Pb^.Schritt := 2; V^.Ausstieg := TRUE ;
UpdateMenus(Pb,2) |
(* noch höher *) 4: Pb^.Schritt := 1; V^.Ausstieg := TRUE ;
UpdateMenus(Pb,2) |
END (* CASE *) ; |
2: (* Einstellungen *)
CASE ItemNummer(code) OF
(* Raster *) 0: IF Pb^.Raster THEN (* Raster ausschalten *)
V^.Ausstieg := TRUE ;
Pb^.Raster := FALSE ;
UpdateMenus(Pb,3) ;
ELSE (* Raster einschalten *)
Pb^.Raster := TRUE ;
Pb^.Kasten := TRUE ;
UpdateMenus(Pb,3) ;
IF Pb^.Flaeche THEN
V^.Ausstieg := TRUE ;
ELSE
KastenZeichnen(Pb) ;
RasterZeichnen(Pb);
IF Pb^.fertig THEN
RestRaster(Pb) ;
END ;
END ;
END (* IF *) |
(* Kasten *) 1: IF Pb^.Kasten THEN (* Kasten ausschalten *)
V^.Ausstieg := TRUE ;
Pb^.Kasten := FALSE ;
Pb^.Raster := FALSE ;
Pb^.Beschriftung := FALSE ;
UpdateMenus(Pb,3) ;
ELSE
Pb^.Kasten := TRUE ; (* Kasten einschalten *)
UpdateMenus(Pb,3) ;
IF Pb^.Flaeche THEN
V^.Ausstieg := TRUE ;
ELSE
KastenZeichnen(Pb) ;
END ;
END (* IF *) |
(* Achsen *) 2: IF Pb^.Achsen THEN
V^.Ausstieg := TRUE ;
Pb^.Achsen := FALSE ;
UpdateMenus(Pb,3) ;
ELSE
V^.Ausstieg := TRUE ;
Pb^.Achsen := TRUE ;
UpdateMenus(Pb,3) ;
XAchseZeichnen(Pb) ; RestXAchseZeichnen(Pb) ;
YAchseZeichnen(Pb) ; RestYAchseZeichnen(Pb) ;
ZAchseZeichnen(Pb) ;
END (* IF *) |
(*Beschriftung*) 3: IF Pb^.Beschriftung THEN (* Beschriftung aus *)
V^.Ausstieg := TRUE ;
Pb^.Beschriftung := FALSE ;
UpdateMenus(Pb,3) ;
ELSE
Pb^.Beschriftung := TRUE ; (* Beschriftung ein *)
Pb^.Kasten := TRUE ;
UpdateMenus(Pb,3) ;
BeschriftungZeichnen(Pb) ;
IF Pb^.Flaeche THEN
V^.Ausstieg := TRUE ;
ELSE
KastenZeichnen(Pb) ;
END ;
END (* IF *) ; |
(* Flaeche *) 4: V^.Ausstieg := TRUE ;
IF Pb^.Flaeche THEN
Pb^.Flaeche := FALSE ;
ELSE
Pb^.Flaeche := TRUE ;
END ;
UpdateMenus(Pb,3) ; |
(* f(x,y) *) 5: IF Pb^.FSchreiben THEN (* f(x,y) löschen *)
Pb^.FSchreiben := FALSE ;
FunktionReinSchreiben(Pb,TRUE) ;
ELSE
Pb^.FSchreiben := TRUE ;
FunktionReinSchreiben(Pb,FALSE) ;
END ;
UpdateMenus(Pb,3) ; |
(*kleine Bmp*) 6: IF Pb^.GrosseBitmap THEN (* Umschalten auf kleine *)
V^.Ausstieg := TRUE ;
Pb^.GrosseBitmap := FALSE ;
Pb^.KastenX0 := 160 ;
Pb^.KastenY0 := 46 ;
UpdateMenus(Pb,3) ;
UpdateMenus(Pb,2) ;
IF Pb^.GrosserSpeicher THEN
ScrollLayer(Pb^.Layer,-Pb^.Layer^.scrollX,
-Pb^.Layer^.scrollY) ;
END (* IF *) ;
END ; |
(* gr Bmp *) 7: IF NOT Pb^.GrosseBitmap THEN (* Umschalten auf grosse *)
IF Pb^.Schritt = 4 THEN
Pb^.Schritt := 3 ;
END ;
V^.Ausstieg := TRUE ;
Pb^.GrosseBitmap := TRUE ;
Pb^.KastenX0 := 450 ;
Pb^.KastenY0 := 138 ;
UpdateMenus(Pb,3) ;
UpdateMenus(Pb,2) ;
END ; |
END (* CASE *) ;
ELSE
END (* CASE *) ;
END (* IF menuPick *) ;
IntuiMsg := GetMsg(Pb^.Screen^.firstWindow^.userPort) ;
END (* WHILE *) ;
IF Pb^.GrosseBitmap THEN
IF V^.IntuiBase^.activeScreen = Pb^.Screen THEN
mousex := Pb^.Screen^.firstWindow^.mouseX ;
mousey := Pb^.Screen^.firstWindow^.mouseY ;
IF (mousex # Pb^.oldX) OR (mousey # Pb^.oldY) THEN
IF (mousex < Pb^.ScreenWidth-100) AND (mousex > 100) THEN
XScroll := FFPToInt(IntToFFP(mousex-100)*V^.PadFaktorX) ;
ELSE IF mousex <= 100 THEN
XScroll:= 0 ;
ELSE
XScroll := BitMapWidth - Pb^.ScreenWidth ;
END (* IF *) ;
END (* IF *) ;
IF (mousey < Pb^.ScreenHeight-100) AND (mousey > 100) THEN
YScroll := FFPToInt(IntToFFP(mousey-100)*V^.PadFaktorY) ;
ELSE IF mousey <= 100 THEN
YScroll := 0 ;
ELSE
YScroll := BitMapHeight - Pb^.ScreenHeight ;
END (* IF *) ;
END (* IF *) ;
ScrollLayer(Pb^.Layer,
XScroll-Pb^.Layer^.scrollX,
YScroll-Pb^.Layer^.scrollY) ;
Pb^.oldX := mousex ;
Pb^.oldY := mousey ;
END (* IF Screen=firstScreen *)
END (* IF *) ;
END (* IF *) ;
END CheckMessage ;
PROCEDURE RFehler ; (******************************************************)
BEGIN
CASE V^.fN OF
3..105 : Pb^.Wert[x,y].YWert := Pb^.KastenY0+2*y |
END (* CASE *) ;
END RFehler ;
PROCEDURE Zeichnen ; (*************************************************)
CONST MaxInt = 32767.0 ;
VAR z0: INTEGER ;
XWert,YWert : FFP ;
P1x,P1y : INTEGER ;
BEGIN
V^.Ausstieg := FALSE ; i := 0 ;
IF V^.NeuBerechnen THEN
V^.NeuBerechnen := FALSE ;
Pb^.fertig := FALSE ;
END ;
IF NOT Pb^.GrosseBitmap THEN (* kleine Bitmap *)
V^.FaktorX := 3.0*Pb^.B.DeltaX/72.0 ;
V^.FaktorY := 3.0*Pb^.B.DeltaY/72.0 ;
V^.FaktorZ := 60.0/Pb^.B.DeltaZ ;
z0 := FFPToInt(Pb^.B.ZOben/Pb^.B.DeltaZ *60.0) ;
Pb^.ymax := 72 ;
V^.YWertmax:= 46 ;
V^.YWertmin:= 286 ;
Pb^.xmax := 96 ;
P1x := -144 ;
P1y := 144 ;
ELSE (* grosse Bitmap *)
V^.FaktorX := Pb^.B.DeltaX/72.0 ;
V^.FaktorY := Pb^.B.DeltaY/72.0 ;
V^.FaktorZ := 180.0/Pb^.B.DeltaZ ;
z0 := 3*FFPToInt(Pb^.B.ZOben/Pb^.B.DeltaZ *60.0) ;
Pb^.ymax := 216 ;
V^.YWertmax:= 46*3 ;
V^.YWertmin:= 286*3 ;
Pb^.xmax := 288 ;
P1x := -432 ;
P1y := 432 ;
END (* IF *) ;
V^.MaxErgebnis := MaxInt/V^.FaktorZ ;
IF NOT (V^.Ausstieg OR V^.Ende) THEN (* erste Spalte *)
y := 0;
WHILE y <= Pb^.ymax DO
V^.XNormiert:=Pb^.B.XLinks;
V^.YNormiert:=IntToFFP(y)*V^.FaktorY+Pb^.B.YHinten ;
WITH Pb^.Wert[0,y] DO
XWert := Pb^.KastenX0-2*y ;
F := f(V^.XNormiert,V^.YNormiert) ;
IF V^.fN =0 THEN
YWert := Pb^.KastenY0+2*y-FFPToInt(V^.FaktorZ*F)+z0 ;
IF YWert < V^.YWertmax+2*y THEN
YWert := V^.YWertmax+2*y
END ;
IF YWert > V^.YWertmin+2*y THEN
YWert := V^.YWertmin+2*y
END ;
ELSE
RFehler ;
END (* IF *) ;
CheckMessage ;
IF (V^.Ausstieg OR V^.Ende) THEN
y := Pb^.ymax+10 ;
END (* IF *) ;
END (* WITH *) ;
y:=y+Pb^.Schritt ;
END (* WHILE *) ;
END (* IF *) ;
IF NOT (V^.Ausstieg OR V^.Ende) THEN (* Erste Zeile *)
x := 0 ; y := 0 ;
WHILE x <= Pb^.xmax DO
V^.XNormiert := IntToFFP(x)*V^.FaktorX+Pb^.B.XLinks;
V^.YNormiert := Pb^.B.YHinten ;
WITH Pb^.Wert[x,0] DO
XWert := 4*x+Pb^.KastenX0 ;
F := f(V^.XNormiert,V^.YNormiert) ;
IF V^.fN = 0 THEN
YWert := Pb^.KastenY0-FFPToInt(V^.FaktorZ*F)+z0 ;
IF YWert < V^.YWertmax+2*y THEN
YWert := V^.YWertmax+2*y
END ;
IF YWert > V^.YWertmin+2*y THEN
YWert := V^.YWertmin+2*y
END ;
ELSE
RFehler ;
END (* IF *) ;
IF x = 0 THEN
Move(Pb^.Rp,Pb^.Wert[0,0].XWert,Pb^.Wert[0,0].YWert) ;
ELSE
Draw(Pb^.Rp,Pb^.Wert[x,0].XWert,Pb^.Wert[x,0].YWert) ;
END (* IF *) ;
i := i+1 ;
IF i > 10 THEN
CheckMessage ; i := 0 ;
END (* IF *) ;
IF (V^.Ausstieg OR V^.Ende) THEN
x := Pb^.xmax+10 ;
END (* IF *) ;
END (* WITH *) ;
x := x+Pb^.Schritt ;
END (* WHILE *) ;
END (* IF *) ;
IF NOT (V^.Ausstieg OR V^.Ende) THEN (* Rest *)
y:=Pb^.Schritt ;
WHILE y <= Pb^.ymax DO
x:= Pb^.Schritt ;
Move(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].XWert,
Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].YWert);
Draw(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
WHILE x <= Pb^.xmax DO
V^.XNormiert:=IntToFFP(x)*V^.FaktorX+Pb^.B.XLinks;
V^.YNormiert:=IntToFFP(y)*V^.FaktorY+Pb^.B.YHinten ;
WITH Pb^.Wert[x,y] DO
XWert := 4*x+Pb^.KastenX0-2*y ;
F := f(V^.XNormiert,V^.YNormiert) ;
IF V^.fN = 0 THEN
YWert := Pb^.KastenY0+2*y-FFPToInt(V^.FaktorZ*F)+z0 ;
IF YWert < V^.YWertmax+2*y THEN
YWert := V^.YWertmax+2*y
END ;
IF YWert > V^.YWertmin+2*y THEN
YWert := V^.YWertmin+2*y
END ;
ELSE
RFehler ;
END (* IF *) ;
END (* WITH *) ;
IF Pb^.Flaeche THEN
SetBPen(Pb^.Rp,1) ;
SetAPen(Pb^.Rp,0) ;
V^.OK := AreaMove(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].XWert,
Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].YWert) ;
V^.OK := AreaDraw(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
Pb^.Wert[x,y-Pb^.Schritt].YWert) ;
V^.OK := AreaDraw(Pb^.Rp,Pb^.Wert[x,y].XWert,
Pb^.Wert[x,y].YWert) ;
V^.OK := AreaDraw(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,
Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
V^.OK := AreaEnd(Pb^.Rp) ;
SetAPen(Pb^.Rp,1) ;
Move(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,
Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
Draw(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].XWert,
Pb^.Wert[x-Pb^.Schritt,y-Pb^.Schritt].YWert) ;
Draw(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
Pb^.Wert[x,y-Pb^.Schritt].YWert) ;
END (* IF *) ;
Move(Pb^.Rp,Pb^.Wert[x-Pb^.Schritt,y].XWert,
Pb^.Wert[x-Pb^.Schritt,y].YWert) ;
Draw(Pb^.Rp,Pb^.Wert[x,y].XWert,
Pb^.Wert[x,y].YWert) ;
Draw(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
Pb^.Wert[x,y-Pb^.Schritt].YWert) ;
IF Pb^.Achsen THEN
IF x = Pb^.A.XNull/4 THEN (* YAchse *)
SetAPen(Pb^.Rp,0) ; (* Hintergrundfarbe *)
Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-2,
Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+1) ;
Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-2,
Pb^.KastenY0+P1y+Pb^.A.ZNull+1) ;
Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-3,
Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+1) ;
Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-3,
Pb^.KastenY0+P1y+Pb^.A.ZNull+1) ;
Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-2,
Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+3) ;
Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-2,
Pb^.KastenY0+P1y+Pb^.A.ZNull+3) ;
Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert-1,
Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)+3) ;
Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull-1,
Pb^.KastenY0+P1y+Pb^.A.ZNull+3) ;
SetAPen(Pb^.Rp,1) ; (* Vordergrundfarbe *)
Move(Pb^.Rp,Pb^.Wert[x,y-Pb^.Schritt].XWert,
Pb^.KastenY0+Pb^.A.ZNull+2*(y-Pb^.Schritt)) ;
Draw(Pb^.Rp,Pb^.KastenX0+P1x+Pb^.A.XNull,
Pb^.KastenY0+P1y+Pb^.A.ZNull) ;
RestYAchseZeichnen(Pb) ;
END ;
END ;
x := x+Pb^.Schritt ;
i := i+1 ;
IF i > 5 THEN
CheckMessage ; i := 0 ;
END (* IF *) ;
IF (V^.Ende OR V^.Ausstieg) THEN
x := Pb^.xmax+10;
END (* IF *) ;
END (* WHILE *) ;
IF Pb^.Achsen THEN
IF 2*y < Pb^.A.YNull+2*Pb^.Schritt THEN (* X,Z-Achse *)
XAchseZeichnen(Pb) ; ZAchseZeichnen(Pb) ;
RestXAchseZeichnen(Pb) ; RestYAchseZeichnen(Pb) ;
END ;
END ;
y := y+Pb^.Schritt ;
IF (V^.Ende OR V^.Ausstieg) THEN
y := Pb^.ymax+10;
END (* IF *) ;
END (* WHILE *) ;
END (* IF *) ;
Pb^.fertig := TRUE ;
END Zeichnen ;
BEGIN (* Haupt *) (***************************************************)
Pb := AllocMem(SIZE(PlotBase),MemReqSet{public,memClear}) ;
IF Pb = NIL THEN
Request('Kein Speicher für PlotBase',"Zu dumm",NIL) ;
Arts.Terminate ;
END ;
V := AllocMem(SIZE(Variablen),MemReqSet{public,memClear}) ;
IF V = NIL THEN
Request('Kein Speicher für Variablen',"Booa ey",NIL) ;
Arts.Terminate ;
END ;
IF (Arts.wbStarted) THEN
V^.msg:=Arts.startupMsg;
V^.lock:=V^.msg^.argList^[0].lock;
IF (V^.lock # NIL) THEN
GetPathFromLock(Pb^.Dir,V^.lock);
END; (* IF *)
ELSE
GetPathFromLock(Pb^.Dir,Arts.oldCurrentDir);
IF Length(Pb^.Dir) = 0 THEN
Pb^.Dir := "SYS:" ;
END ;
END; (* IF *)
Copy(Pb^.DirBilder,Pb^.Dir) ;
IF NumArgs() >0 THEN
GetArg(1,Pb^.Funktion,V^.len) ;
IF Compare(Pb^.Funktion,"?")=0 THEN (* Fragezeichen übergeben *)
InOut.WriteString('Plot V1.0 vom 16.10.92\n') ;
InOut.WriteString('Stefan Köhle\n') ;
InOut.WriteString('Erhardtstr. 10\n7033 Herrenberg\n') ;
Arts.Terminate ;
END ;
V^.Argument := TRUE ; (* Argument vorhanden *)
END ;
V^.IntuiBase := ADR(IntuitionL) ;
Pb^.Flaeche := TRUE ; Pb^.Raster := TRUE ; Pb^.FSchreiben := TRUE ;
Pb^.GrosserSpeicher := TRUE ; Pb^.Kasten := TRUE ; Pb^.Achsen := TRUE ;
Pb^.GrosseBitmap := FALSE ;Pb^.Beschriftung := TRUE ;
Pb^.oldX := 0; Pb^.oldY := 0 ;
Pb^.FaktorX:=0.1; Pb^.FaktorY:=0.1; Pb^.FaktorZ:= 50.0 ;
Pb^.Schritt := 6;
Pb^.B.XLinks := 0.0 ;
Pb^.B.DeltaX := 1.0 ;
Pb^.B.YHinten := 0.0 ;
Pb^.B.DeltaY := 1.0 ;
Pb^.B.ZOben := 2.0 ;
Pb^.B.DeltaZ := 1.0 ;
Pb^.KastenX0 := 160 ;
Pb^.KastenY0 := 46 ;
Pb^.LetzteFunktion := '0' ;
Pb^.fertig := FALSE ;
StartUp ;
Pb^.Rp := Pb^.Screen^.firstWindow^.rPort ;
(* Berechnungen für Scrollerei *)
V^.PadHeight:= Pb^.ScreenHeight-200 ;
V^.PadWidth:= Pb^.ScreenWidth-200 ;
V^.PadFaktorX := IntToFFP(BitMapWidth-Pb^.ScreenWidth)/IntToFFP(V^.PadWidth);
V^.PadFaktorY := IntToFFP(BitMapHeight-Pb^.ScreenHeight)/IntToFFP(V^.PadHeight) ;
V^.Ende := FALSE ;
V^.Ausstieg := TRUE ;
V^.NeuBerechnen := TRUE ;
ClearBitMap(Pb) ;
ScreenHoch(Pb^.Screen) ;
Pb^.BildName := 'Bild' ;
IF NOT ArgTesten(Pb,V^.Argument) THEN
IF V^.Argument THEN (* cancel beim StringRequester *)
IF NOT Laden(Pb,TRUE) THEN (* war nix mit Laden *)
Pb^.Funktion := "0" ; (* Defaultfunktion *)
Pb^.FunktionName := '';
V^.OK := FunktionHolen(Pb,TRUE,FALSE) ;
END ;
ELSE (* kein Argument übergeben *)
IF NOT FunktionHolen(Pb,FALSE,TRUE) THEN
IF NOT Laden(Pb,TRUE) THEN (* war nix mit Laden *)
Pb^.Funktion := "0" ; (* Defaultfunktion *)
Pb^.FunktionName := '' ;
V^.OK := FunktionHolen(Pb,TRUE,FALSE) ;
END ;
END ;
END (* IF *) ;
END ;
UpdateMenus(Pb,2) ;
UpdateMenus(Pb,3) ;
UpdatePb(Pb) ;
V^.NeuBerechnen := TRUE ;
V^.Ausstieg := TRUE ;
LOOP
IF V^.Ausstieg THEN
ClearBitMap(Pb) ;
IF Pb^.Kasten THEN KastenZeichnen(Pb) ; END ;
IF Pb^.Achsen THEN
XAchseZeichnen(Pb) ; YAchseZeichnen(Pb) ; ZAchseZeichnen(Pb) ;
RestXAchseZeichnen(Pb); RestYAchseZeichnen(Pb) ;
END ;
IF Pb^.Raster THEN RasterZeichnen(Pb) ; END ;
IF Pb^.Beschriftung THEN BeschriftungZeichnen(Pb) ; END ;
IF Pb^.FSchreiben THEN FunktionReinSchreiben(Pb,FALSE) ; END ;
Zeichnen ;
IF (NOT V^.Ausstieg) AND (NOT V^.Ende) THEN
IF Pb^.Raster THEN RestRaster(Pb) ; END (* IF *) ;
IF Pb^.Achsen THEN
RestXAchseZeichnen(Pb) ; RestYAchseZeichnen(Pb) ;
END (* IF *) ;
END ;
END (* IF *) ;
IF (NOT V^.Ausstieg) AND (NOT V^.Ende) THEN
DosL.Delay(2) ;
CheckMessage ;
END ;
IF V^.Ende THEN
EXIT ;
END ;
END (* LOOP *) ;
CLOSE
IF Pb # NIL THEN
IF Pb^.Screen # NIL THEN
ScreenWeg(Pb^.Screen) ;
END ;
CleanUp(Pb) ;
END ;
IF Pb # NIL THEN FreeMem(Pb,SIZE(PlotBase)) ; Pb := NIL ; END ;
IF V # NIL THEN FreeMem(V,SIZE(Variablen)) ; V := NIL ; END ;
END Plot.MOD